package java6703.lesson02.regex;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Paint;
import javafx.stage.Stage;

import java.util.List;

public class CheckRegex6703 extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(getRoot(), 800, 600);
        primaryStage.setScene(scene);
        primaryStage.setTitle("验证正则表达式");
        primaryStage.show();
    }

    private Parent getRoot() {
        //显示每个人的学号和姓名
        Label lblStudent = new Label("212106703 陈杰");
        BorderStroke bs = new BorderStroke(Paint.valueOf("#8FBC8F"),//边框的颜色
                BorderStrokeStyle.DOTTED,//边框的样式
                new CornerRadii(10),//边框四个角的圆角
                new BorderWidths(3));//边框的宽度
        lblStudent.setBorder(new Border(bs));//设置边框
        lblStudent.setPadding(new Insets(10));//设置边距

        //输入正则表达式的两个控件用水平排列
        HBox hRegex = new HBox(10);
        Label lblRegex = new Label("正则表达式：");
        TextField tfRegex = new TextField();
        hRegex.getChildren().addAll(lblRegex, tfRegex);//添加两个控件
        hRegex.setAlignment(Pos.CENTER_LEFT);//垂直居中，水平靠左
        HBox.setHgrow(tfRegex, Priority.ALWAYS);//文本框的宽度填满剩余空间

        Label lblInput = new Label("输入要检验的一组字符串（用逗号分隔）");
        //多行文本框，输入一组要验证的字符串
        TextArea taInput = new TextArea();
        taInput.setPrefRowCount(4);//4行
        taInput.setPrefColumnCount(20);//20列
        taInput.setWrapText(true);//允许自动换行

        Button button = new Button("验证字符串是否符合正则表达式");

        //用于输入的控件采用垂直排列
        VBox vInput = new VBox(20);
        //添加子节点
        vInput.getChildren().addAll(hRegex, lblInput, taInput, button);
        vInput.setPadding(new Insets(20.0));//设置边距
        vInput.setAlignment(Pos.CENTER);//对齐方式

        //列表显示验证结果
        ListView<String> lvPrint = new ListView<>();
        lvPrint.getItems().add("显示验证结果");

        //水平排列：左边输入，右边显示结果
        HBox hBox = new HBox();
        hBox.getChildren().addAll(vInput, lvPrint);

        //垂直排列的根节点
        VBox root = new VBox(20);//节点之间的垂直间距20
        //为根节点添加子节点
        root.getChildren().addAll(lblStudent, hBox);
        root.setPadding(new Insets(20.0));//设置根节点的边距
        root.setAlignment(Pos.TOP_CENTER);//根节点中各节点的对齐方式

        root.setStyle("-fx-font-size:20");//用CSS样式设置容器中所有节点的字体大小

        /**
         *  (1）读取单行文本框中输入的正则表达式（提示：使用getText方法）
         * （2）读取多行文本框中输入的字符串---->strInput变量（提示：使用getText方法）
         * （3）用逗号拆分字符串strInput---->inputs数组
         *  (4）清空ListView中已有的内容（提示：使用getItems().clear()
         *  (5）对数组inputs中的每个元素进行如下操作如果内容不为空，
         *  则：①验证是否满足正则表达式，②将当前元素及验证结果添加到ListView（提示：使用getItems().add()）
         */
        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {

                //读取单行文本框中输入的正则表达式
                String regex = tfRegex.getText();

                //读取多行文本框中输入的字符串---->strInput变量
                String strInput =  taInput.getText();

                //用逗号拆分字符串strInput---->inputs数组
                String[] inputs = strInput.split("[,，]");

                //清空ListView中已有的内容（提示：使用getItems().clear())
                lvPrint.getItems().clear();

                //对数组inputs中的每个元素进行如下操作如果内容不为空，则：
                // ①验证是否满足正则表达式，
                // ②将当前元素及验证结果添加到ListView（提示：使用getItems().add()）
                for (String s : inputs){
                    lvPrint.getItems().addAll(s+":"+s.matches(regex));
                }
            }
        });

        return root;
    }
}
